'''
Description: 
Author: Zilu
Date: 2021-11-17 19:35:27
Version: 
LastEditTime: 2021-11-17 20:18:36
LastEditors: Zilu
'''

# 在Python中，最有名的ORM框架是SQLAlchemy。
# 导入：
from sqlalchemy import Column, String, create_engine, BigInteger, Integer
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# 创建对象的基类
Base = declarative_base()

class Student(Base):
    # 表的名字
    __tablename__ = 'students'

    # 表的结构
    id = Column(BigInteger, primary_key=True)
    class_id = Column(BigInteger)
    name = Column(String(100))
    gender = Column(String(1))
    score = Column(Integer)

# 初始化数据库连接，连接形式为：
# '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
# 特殊字符使用url解析
from urllib.parse import quote_plus as urlplus
engine = create_engine('mysql+mysqlconnector://root:%s@localhost:3306/test' % urlplus('159875321.0@As'))

# 创建DBSession类型
DBSession = sessionmaker(bind=engine)

# 创建DBSession对象
session = DBSession()
# 新建表单项对象
new_student = Student(class_id=2, name='蔚奥莱', gender='F', score=69)
# 添加表单对象
session.add(new_student)
session.commit()
session.close()

session = DBSession()
# 使用 Query 查询
# all返回所有，one返回一行
students = session.query(Student).filter(Student.id>13).all()
print('type:', type(students))
print('type:', type(students[0]))
print('name:', students[0].name, students[1].name)
session.close()

# 可以使用relation定义一对多关系
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
class User(Base):
    __tablename__ = 'user'

    id = Column(String(20), primary_key=True)
    name = Column(String(20))
    # 一对多:
    books = relationship('Book')

class Book(Base):
    __tablename__ = 'book'

    id = Column(String(20), primary_key=True)
    name = Column(String(20))
    # “多”的一方的book表是通过外键关联到user表的:
    user_id = Column(String(20), ForeignKey('user.id'))

# 当我们查询一个User对象时，该对象的books属性将返回一个包含若干个Book对象的list。

# ORM框架的作用就是把数据库表的一行记录与一个对象互相做自动转换。



